pull: Add per-remote cookie jar
authorSjoerd Simons <sjoerd@luon.net>
Mon, 17 Oct 2016 19:39:38 +0000 (21:39 +0200)
committerAtomic Bot <atomic-devel@projectatomic.io>
Sat, 5 Nov 2016 17:34:09 +0000 (17:34 +0000)
Optionally read cookie jars for a remote to be used when downloading
data. This can be used for private repositories which require specific
cookies to be present, e.g. repositories hosted on Amazon cloudfront
using signed cookies.

Closes: #531
Approved by: cgwalters

src/libostree/ostree-fetcher.c
src/libostree/ostree-fetcher.h
src/libostree/ostree-repo-pull.c

index 21526813cd9e992c653b9ac96934a3424193f0c5..a4d460166814b5bfd219b82061a5ad1411064a16 100644 (file)
@@ -326,6 +326,16 @@ session_thread_set_proxy_cb (ThreadClosure *thread_closure,
     }
 }
 
+static void
+session_thread_set_cookie_jar_cb (ThreadClosure *thread_closure,
+                                  gpointer data)
+{
+  SoupCookieJar *jar = data;
+
+  soup_session_add_feature (thread_closure->session,
+                            SOUP_SESSION_FEATURE (jar));
+}
+
 #ifdef HAVE_LIBSOUP_CLIENT_CERTS
 static void
 session_thread_set_tls_interaction_cb (ThreadClosure *thread_closure,
@@ -746,6 +756,23 @@ _ostree_fetcher_set_proxy (OstreeFetcher *self,
     }
 }
 
+void
+_ostree_fetcher_set_cookie_jar (OstreeFetcher *self,
+                                const char    *jar_path)
+{
+  SoupCookieJar *jar;
+
+  g_return_if_fail (OSTREE_IS_FETCHER (self));
+  g_return_if_fail (jar_path != NULL);
+
+  jar = soup_cookie_jar_text_new (jar_path, TRUE);
+
+  session_thread_idle_add (self->thread_closure,
+                           session_thread_set_cookie_jar_cb,
+                           jar,  /* takes ownership */
+                           (GDestroyNotify) g_object_unref);
+}
+
 void
 _ostree_fetcher_set_client_cert (OstreeFetcher   *self,
                                  GTlsCertificate *cert)
index 8cceca514d4323e6980d5b3bf1e857360e06a88a..ae20edaaa2e2727ed3eecee2e2c0d2f689a99550 100644 (file)
@@ -59,6 +59,9 @@ OstreeFetcher *_ostree_fetcher_new (int                      tmpdir_dfd,
 
 int  _ostree_fetcher_get_dfd (OstreeFetcher *fetcher);
 
+void _ostree_fetcher_set_cookie_jar (OstreeFetcher *self,
+                                     const char    *jar_path);
+
 void _ostree_fetcher_set_proxy (OstreeFetcher *fetcher,
                                 const char    *proxy);
 
index 1f57b133426d9c165b45286b2ef158a27394050f..8facf8cb37c3d7fdc0fa3465bdd86780c57474f8 100644 (file)
@@ -1964,6 +1964,19 @@ _ostree_repo_remote_new_fetcher (OstreeRepo  *self,
       _ostree_fetcher_set_proxy (fetcher, http_proxy);
   }
 
+  {
+    g_autofree char *jar_path = NULL;
+    g_autofree char *cookie_file = g_strdup_printf ("%s.cookies.txt",
+                                                    remote_name);
+
+    jar_path = g_build_filename (g_file_get_path (self->repodir), cookie_file,
+                                 NULL);
+
+    if (g_file_test(jar_path, G_FILE_TEST_IS_REGULAR))
+      _ostree_fetcher_set_cookie_jar (fetcher, jar_path);
+
+  }
+
   success = TRUE;
 
 out: